import 'package:flutter/material.dart';
import 'package:petitparser/petitparser.dart';

///petitparser 支持解析器的组合。
///可以将多个解析器组合成一个更复杂的解析器。
class EAndParser extends StatefulWidget {
  const EAndParser({super.key});

  @override
  State<EAndParser> createState() => _EAndParserState();
}

class _EAndParserState extends State<EAndParser> {
  var resultStr = '';
  final invalidStr = 'Invalid input';
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: const Text('构建解析器'),
        ),
        body: SingleChildScrollView(
          child: Container(
            padding: EdgeInsets.all(16),
            child: Column(
              children: [
                Text('待解析数据"1 + 2" 和 "3 - 1"'),
                SizedBox(height: 10),
                TextButton(
                    onPressed: () {
                      _buildParser();
                      setState(() {});
                    },
                    child: Text('开始解析')),
                Text('解析结果："'),
                SizedBox(height: 10),
                Container(
                  color: const Color.fromARGB(255, 224, 224, 224),
                  child: Text(resultStr),
                ),
              ],
            ),
          ),
        ));
  }

  void _buildParser() {
    resultStr = '';
    // 创建一个解析器，用于解析一个数字字符并将其转换为整数
    final digitParser = digit().flatten().map(int.parse);

    // 创建一个解析器，用于解析 '+' 字符并忽略其两边的空白字符
    final addParser = char('+').trim();

    // 创建一个解析器，用于解析 '-' 字符并忽略其两边的空白字符
    final subtractParser = char('-').trim();

    // 使用 `seq` 方法将 `digitParser` 和 `addParser` 组合成一个解析器
    // 这个解析器可以解析形如 "[数字] + [数字]" 的字符串
    final addExpressionParser = digitParser.seq(addParser).seq(digitParser);

    // 使用 `seq` 方法将 `digitParser` 和 `subtractParser` 组合成一个解析器
    // 这个解析器可以解析形如 "[数字] - [数字]" 的字符串
    final subtractExpressionParser = digitParser.seq(subtractParser).seq(digitParser);

    // 使用 `or` 方法将 `addExpressionParser` 和 `subtractExpressionParser` 组合成一个解析器
    // 这个解析器可以解析形如 "[数字] + [数字]" 或 "[数字] - [数字]" 的字符串
    final expressionParser = addExpressionParser.or(subtractExpressionParser);

    // 使用 `expressionParser` 来解析字符串 '1 + 2'
    final addResult = expressionParser.parse('1 + 2');
    if (addResult.isSuccess) {
      // 如果解析成功，打印出两个数字的和
      final values = addResult.value;
      final firstNumber = values[0];
      final secondNumber = values[2];
      resultStr = '$firstNumber\n\n$secondNumber';
      print('The sum is ${firstNumber + secondNumber}');
    } else {
      resultStr = 'Invalid input';
      // 如果解析失败，打印 'Invalid input'
      print('Invalid input');
    }

    // 使用 `expressionParser` 来解析字符串 '3 - 1'
    final subtractResult = expressionParser.parse('3 - 1');
    if (subtractResult.isSuccess) {
      // 如果解析成功，打印出两个数字的差
      final values = subtractResult.value;
      final firstNumber = values[0];
      final secondNumber = values[2];
      resultStr = '$resultStr\n\n$firstNumber\n\n$secondNumber';
      print('The difference is ${firstNumber - secondNumber}');
    } else {
      resultStr = '$resultStr\n\n Invalid input';
      // 如果解析失败，打印 'Invalid input'
      print('Invalid input');
    }
  }
}
